/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.proyecto.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.RutaProyecto;
import sv.com.intesal.clases.XMLReporte;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.proyecto.bean.UtilizacionProyecto;
import sv.com.intesal.proyecto.sql.SQLUtilizacionProyecto;
import sv.com.intesal.seguridad.bean.ParametroSicopi;
import sv.com.intesal.seguridad.controlador.BitacoraControlador;
import sv.com.intesal.seguridad.controlador.ParametroSicopiControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;

/**
 *
 * @author JM
 */
public class UtilizacionProyectoControlador {

    public void setEnca(UtilizacionProyecto up, List<UtilizacionProyecto> listaUp) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        SessionControlador sc = new SessionControlador();
        ParametroSicopiControlador pc = new ParametroSicopiControlador();
        ParametroSicopi pp = pc.getParametroSicopi("UTILIZACION_PROYECTO");
        try {
            cnn = cConexion.conectar();
            if (up.getId_up() == null) {
                /*INSERT*/
                ps = cnn.prepareStatement(SQLUtilizacionProyecto.insertUtilizacionENCA);
                ps.setInt(1, up.getId_e());
                ps.setInt(2, up.getId_p());
                ps.setInt(3, sc.getCodigo_Usuario());
                ps.setDate(4, cVarios.getFecha(up.getFecha_up()));
                ps.setInt(5, pp.getCorrelativo_ps());//correlativo
                ps.setInt(6, pp.getBloque_ps());//bloque
                ps.setString(7, up.getObservacion_up());
                ps.executeUpdate();

                pc.updateCorrelativo("UTILIZACION_PROYECTO");
                listaUp.get(0).setNumero_documento_up(1);//ASIGNAR BLOQUE

            } else {
                /*MODIFICAION*/
                ps = cnn.prepareStatement(SQLUtilizacionProyecto.insertUtilizacionEnca_Modificacion);
                ps.setInt(1, up.getId_e());
                ps.setInt(2, up.getId_p());
                ps.setDate(3, cVarios.getFecha(up.getFecha_up()));
                ps.setInt(4, up.getNumero_documento_up());
                ps.setString(5, up.getObservacion_up());
                ps.setInt(6, up.getId_up());
                ps.executeUpdate();
            }

            ps.close();
            this.setDeta(up, listaUp);

            Mensaje m = new Mensaje();
            if (up.getId_up() == null) {
                m.messageInfo(m.getIinformation());
            } else {
                m.messageInfo(m.getImodificada());
            }
        } catch (Exception e) {
            throw new Exception(e);
        }

    }

    public void setDeta(UtilizacionProyecto up, List<UtilizacionProyecto> listaUp) throws Exception {
        try {
            Integer codigo_up = up.getId_up();
            if (up.getId_up() == null) {
                codigo_up = this.getMax();
                this.cambiarEstado("AC", codigo_up);
            }

            //MaterialControlador mc = new MaterialControlador();
            // BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < listaUp.size(); i++) {
                if (listaUp.get(i).getId_d() == 0) { //SI SOLO ES UN NUEVO REGISTRO
                    PreparedStatement ps = null;
                    Connection cnn = null;
                    cnn = cConexion.conectar();
                    ps = cnn.prepareStatement(SQLUtilizacionProyecto.insertUtilizacionDETA);

                    ps.setInt(1, listaUp.get(i).getId_dm());
                    ps.setInt(2, codigo_up);
                    ps.setDouble(3, listaUp.get(i).getCantidad_d());
                    ps.executeUpdate();
                    ps.close();
                    //cnn.close();

                    /* AUMENTAR CANTIDAD DE MATERIAL */
                    //mc.setCantidadMaterial_Aumentar_Disminuir(codigo_dp, listaUp.get(i).getId_dm(), listaUp.get(i).getCantidad_d(), "A", bc.ingresarDevolucionProyecto + ": " + listaUp.get(0).getNumero_documento_up(), bc.ingresarDevolucionProyecto);
                }
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Integer getMax() {

        try {
            Connection cnn = null;
            ResultSet rs = cConexion.conectar().prepareStatement(SQLUtilizacionProyecto.getMax).executeQuery();
            rs.next();
            return rs.getInt("max");
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    public List<UtilizacionProyecto> getConsulta_UtilizacionProyecto(UtilizacionProyecto up) throws Exception {
        List<UtilizacionProyecto> lista = new ArrayList<UtilizacionProyecto>();

        try {

            ResultSet rs = null;
            PreparedStatement ps = null;
            Connection cnn = null;

            cnn = cConexion.conectar();

            String var_estado = " and up.estado_up='AC' ";
            String var_fechas = this.getFiltro_Fechas(up);
            String var_proyecto = " and p.id_p=" + up.getId_p() + " ";
            String var_cliente = " and cl.id_c=" + up.getId_cl();

            if (up.getFiltrar_estado() == true) {
                var_estado = " "; //trae todos los estados.
            }
            if (up.getId_p() == null) {
                var_proyecto = " ";//trae todos los proyectos.
            }
            if (up.getId_cl() == null) {
                var_cliente = " ";
            }
            var_cliente = " ";
            String sql = "SELECT * FROM CLIENTE as cl,PROYECTO as p,UTILIZACION_PROYECTO as up,EMPLEADO as e where e.id_e=up.id_e and cl.id_c=p.id_c and p.id_p=up.id_p "
                    + var_estado + var_fechas + var_proyecto + var_cliente + "  order by cl.empresa_c,up.fecha_up,up.numero_documento_up";

            ps = cnn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                UtilizacionProyecto uP = new UtilizacionProyecto();

                /*DEVOLUCION PROYECTO*/
                uP.setFecha_up(rs.getDate("fecha_up"));
                uP.setId_up(rs.getInt("id_up"));
                uP.setObservacion_up(rs.getString("observacion_up"));
                uP.setNumero_documento_up(rs.getInt("numero_documento_up"));
                uP.setBloque_up(rs.getInt("bloque_up"));
                uP.setFechahora(rs.getTimestamp("fechahora"));
                uP.setEstado_up(rs.getString("estado_up"));

                /*EMPLEADO*/
                uP.setApellido_e(rs.getString("apellido_e"));
                uP.setNombre_e(rs.getString("nombre_e"));
                uP.setNombre_completo_e(rs.getString("nombre_e") + " " + rs.getString("apellido_e"));
                uP.setId_e(rs.getInt("id_e"));

                /*CLIENTE*/
                uP.setId_cl(rs.getInt("id_c"));
                uP.setEmpresa_cl(rs.getString("empresa_c"));

                /*PROYECTO*/
                uP.setId_p(rs.getInt("id_p"));
                uP.setNombre_p(rs.getString("nombre_p"));
                lista.add(uP);
            }

            rs.close();
            cnn.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<UtilizacionProyecto> getDetaUtilizacionProyecto(Integer codigo_up) throws Exception {

        List<UtilizacionProyecto> lista = new ArrayList<UtilizacionProyecto>();
        ResultSet rs = null;
        PreparedStatement ps = null;
        Connection cnn = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLUtilizacionProyecto.getUtilizacionProyecto);
            ps.setInt(1, codigo_up);
            rs = ps.executeQuery();

            while (rs.next()) {
                UtilizacionProyecto up = new UtilizacionProyecto();
                /*DEVOLUCION PROYECTO*/
                up.setFecha_up(rs.getDate("fecha_up"));
                up.setId_up(rs.getInt("id_up"));
                up.setObservacion_up(rs.getString("observacion_up"));
                up.setNumero_documento_up(rs.getInt("numero_documento_up"));
                up.setEstado_up(rs.getString("estado_up"));
                up.setBloque_up(rs.getInt("bloque_up"));

                /*EMPLEADO*/
                up.setApellido_e(rs.getString("apellido_e"));
                up.setNombre_e(rs.getString("nombre_e"));
                up.setId_e(rs.getInt("id_e"));

                /*CLIENTE*/
                up.setId_cl(rs.getInt("id_c"));
                up.setEmpresa_cl(rs.getString("empresa_c"));

                /*PROYECTO*/
                up.setId_p(rs.getInt("id_p"));
                up.setNombre_p(rs.getString("nombre_p"));

                /*DETA_DEVOLUCION*/
                up.setId_dm(rs.getInt("id_dm"));
                up.setId_d(rs.getInt("id_d"));
                up.setCantidad_d(rs.getDouble("cantidad_d"));
                up.setNombre_m(rs.getString("nombre_m"));

                /*MATERIAL*/
                lista.add(up);
            }

            cnn.close();
            rs.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }

    }

    public void anularUtilizacionProyecto(List<UtilizacionProyecto> listUP) throws Exception {
        try {
            //MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            //for (int i = 0; i < listUP.size(); i++) {
            //mc.setCantidadMaterial_Aumentar_Disminuir(listDP.get(i).getId_dp(), listDP.get(i).getId_dm(), listDP.get(i).getCantidad_d(), "D", bc.anulacionDevolucionProyecto + ": " + listDP.get(i).getNumero_documento_dp(), bc.anulacionDevolucionProyecto);
            //}
            bc.setBitacoraAnulacion(listUP.get(0).getId_up(), bc.anulacionUtilizacionProyecto + ": " + listUP.get(0).getNumero_documento_up(), bc.anulacionUtilizacionProyecto);
            Mensaje m = new Mensaje();
            m.messageInfo(m.getIanulada());
            this.cambiarEstado("A", listUP.get(0).getId_up());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validarUtilizacion(List<UtilizacionProyecto> listDP) throws Exception {
        try {
//            MaterialControlador mc = new MaterialControlador();
//            for (int i = 0; i < listDP.size(); i++) {
//                if (mc.validar_cantidad(listDP.get(i).getId_dm(), listDP.get(i).getCantidad_d()) == false) {
//                    return false;
//                }
//            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public Boolean validar_ItemEliminarUtilizacion(UtilizacionProyecto dp) throws Exception {

        try {
//        MaterialControlador mc = new MaterialControlador();
//
//        if (mc.validar_cantidad(dp.getId_dm(), dp.getCantidad_d()) == false) {
//            return false;
//        }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public void cambiarEstado(String estado, Integer codigo_up) throws Exception {

        try {
            PreparedStatement ps = null;
            Connection cnn = null;
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLUtilizacionProyecto.cambiarEstado);
            ps.setString(1, estado);
            ps.setInt(2, codigo_up);
            ps.executeUpdate();

            ps.close();
            cnn.close();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void eliminarItem(UtilizacionProyecto up) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLUtilizacionProyecto.setEliminarDeta);
            ps.setInt(1, up.getId_d());
            ps.executeUpdate();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIeliminada());

            //MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();
            //mc.setCantidadMaterial_Aumentar_Disminuir(up.getId_up(), up.getId_dm(), up.getCantidad_d(), "D", bc.eliminarItemDevolucionProyecto + ": " + up.getNumero_documento_up(), bc.eliminarItemDevolucionProyecto);
            bc.setBitacoraAnulacion(up.getId_up(), bc.eliminarItemUtilizacionProyecto + ": " + up.getNumero_documento_up(), bc.eliminarItemUtilizacionProyecto);

        } catch (Exception e) {
            cnn.rollback();
            throw new Exception(e);
        }
    }

    public UtilizacionProyecto getEnca(Integer codigo_up) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLUtilizacionProyecto.getEncaUP);
            ps.setInt(1, codigo_up);
            rs = ps.executeQuery();
            rs.next();

            UtilizacionProyecto up = new UtilizacionProyecto();

            up.setId_up(rs.getInt("id_up"));
            up.setId_e(rs.getInt("id_e"));
            up.setId_p(rs.getInt("id_p"));

            up.setId_u(rs.getInt("id_u"));
            up.setFecha_up(rs.getDate("fecha_up"));
            up.setFechahora(rs.getTimestamp("fechahora"));

            up.setObservacion_up(rs.getString("observacion_up"));
            up.setEstado_up(rs.getString("estado_up"));
            up.setNumero_documento_up(rs.getInt("numero_documento_up"));
            up.setBloque_up(rs.getInt("bloque_up"));

            cnn.close();
            ps.close();
            rs.close();

            return up;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<UtilizacionProyecto> getDeta(Integer codigo_up) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            List<UtilizacionProyecto> lista = new ArrayList<UtilizacionProyecto>();

            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLUtilizacionProyecto.getDetaUp);
            ps.setInt(1, codigo_up);
            rs = ps.executeQuery();

            while (rs.next()) {
                UtilizacionProyecto dp = new UtilizacionProyecto();
                dp.setId_d(rs.getInt("id_d"));
                dp.setId_dm(rs.getInt("id_dm"));

                dp.setNombre_m(rs.getString("nombre_m"));
                dp.setCantidad_d(rs.getDouble("cantidad_d"));
                lista.add(dp);
            }

            rs.close();
            cnn.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void modificarUtilizacionProyecto(UtilizacionProyecto up) throws Exception {

        try {
            SessionControlador sc = new SessionControlador();
            sc.redireccionar_Codigo_Proceso_Modifcar(up.getId_up(), RutaProyecto.wfrmUtilizacionProyecto);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<UtilizacionProyecto> getUtilizacionProyecto_x_Proyecto(Integer codigo_p) throws Exception {

        List<UtilizacionProyecto> lista = new ArrayList<UtilizacionProyecto>();
        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLUtilizacionProyecto.getEncaUP_x_Proyecto);
            ps.setInt(1, codigo_p);
            rs = ps.executeQuery();

            while (rs.next()) {
                UtilizacionProyecto up = new UtilizacionProyecto();
                up.setFecha_up(rs.getDate("fecha_up"));
                up.setId_up(rs.getInt("id_up"));
                up.setObservacion_up(rs.getString("observacion_up"));
                up.setNumero_documento_up(rs.getInt("numero_documento_up"));
                up.setBloque_up(rs.getInt("bloque_up"));
                up.setFechahora(rs.getTimestamp("fechahora"));
                up.setEstado_up(rs.getString("estado_up"));

                /*EMPLEADO*/
                up.setApellido_e(rs.getString("apellido_e"));
                up.setNombre_e(rs.getString("nombre_e"));
                up.setNombre_completo_e(rs.getString("nombre_e") + " " + rs.getString("apellido_e"));
                up.setId_e(rs.getInt("id_e"));

                /*CLIENTE*/
                up.setId_cl(rs.getInt("id_c"));
                up.setEmpresa_cl(rs.getString("empresa_c"));

                /*PROYECTO*/
                up.setId_p(rs.getInt("id_p"));
                up.setNombre_p(rs.getString("nombre_p"));
                lista.add(up);
            }
            cnn.close();
            ps.close();
            rs.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    /*REPORTES*/
    public void generarReporte_Detalle(UtilizacionProyecto up) throws Exception {
        /*GENERAR REPROTE PARA UNA DEVOLUCION DE PROYECTO.*/
        try {

            String sql = "SELECT s.nombre_s,p.nombre_p,cl.empresa_c,cl.registro_c,cl.nit_c,cl.giro_c,p.descripcion_p,p.direccion_p,p.fecha_inicio_p,p.fecha_finalizacion_p,up.fecha_up,up.fechahora,up.observacion_up,up.bloque_up,up.numero_documento_up,m.nombre_m,m.codigo_barra_m,d.cantidad_d, (e.nombre_e || ' ' || e.apellido_e) nombre,tc.nombre_tc,tp.nombre_tp FROM CLIENTE as cl, PROYECTO as p,UTILIZACION_PROYECTO as up,DETA_UTILIZACION_PROYECTO as d,EMPLEADO as e,MATERIAL_SUCURSAL as ms,MATERIAL as m,TIPO_PROYECTO as tp,TIPO_CLIENTE as tc,SUCURSAL as s where m.id_m=ms.id_m and ms.id_dm=d.id_dm and e.id_e=up.id_e and cl.id_c=p.id_c and tp.id_tp=p.id_tp and tc.id_tc=cl.id_tc and p.id_p=up.id_p and up.id_up=d.id_up  and s.codigo_s=ms.codigo_s "
                    + " and up.id_up=" + up.getId_up() + "  order by cl.id_c,up.fecha_up,up.numero_documento_up ";
            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void generarReporte_Enca(UtilizacionProyecto up) throws Exception {

        try {

            String var_estado = " and up.estado_up='AC' ";
            String var_fechas = this.getFiltro_Fechas(up);
            String var_proyecto = " and p.id_p=" + up.getId_p() + " ";
            String var_cliente = " and cl.id_c=" + up.getId_cl();

            if (up.getFiltrar_estado() == true) {
                var_estado = " "; //trae todos los estados.
            }
            if (up.getId_p() == null) {
                var_proyecto = " ";//trae todos los proyectos.
            }
            if (up.getId_cl() == null) {
                var_cliente = " ";
            }
            var_cliente = " ";
            String sql = "SELECT * FROM CLIENTE as cl,PROYECTO as p,UTILIZACION_PROYECTO as up,EMPLEADO as e where e.id_e=up.id_e and cl.id_c=p.id_c and p.id_p=up.id_p " + var_estado + var_fechas + var_proyecto + var_cliente + "  order by cl.empresa_c,up.fecha_up,up.numero_documento_up";

            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);

        } catch (Exception e) {
            throw new Exception(e);
        }
    }


  private String getFiltro_Fechas(UtilizacionProyecto up) {
        try {
            String var_fechas = " ";
            if (up.getFecha_i() != null && up.getFecha_f() == null) {
                var_fechas = " and up.fecha_up >='" + cVarios.getFecha(up.getFecha_i()) + "' ";
            } else if (up.getFecha_f() != null && up.getFecha_i() == null) {
                var_fechas = " and up.fecha_up <='" + cVarios.getFecha(up.getFecha_f()) + "' ";
            } else if (up.getFecha_i() == null && up.getFecha_f() == null) {
                var_fechas = " ";
            } else {
                var_fechas = " and up.fecha_up between '" + cVarios.getFecha(up.getFecha_i()) + "' and '" + cVarios.getFecha(up.getFecha_f()) + "' ";
            }
            return var_fechas;
        } catch (Exception e) {
            return " ";
        }
    }
}
